package encheres.presentation.controleur;

import java.io.FileInputStream;
import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Properties;

import org.omg.CORBA.ORB;
import org.omg.CosNaming.NameComponent;
import org.omg.CosNaming.NamingContext;
import org.omg.CosNaming.NamingContextHelper;

import encheres.exceptions.EncheresUIException;
import encheres.manager.corba.C_Categorie;
import encheres.manager.corba.C_Enchere;
import encheres.manager.corba.C_Filtre;
import encheres.manager.corba.C_Produit;
import encheres.manager.corba.I_Categorie;
import encheres.manager.corba.I_CategorieHelper;
import encheres.manager.corba.I_Produit;
import encheres.manager.corba.I_ProduitHelper;
import encheres.presentation.ui.CorbaManager;
import encheres.presentation.ui.JPanelListerProduits.FILTRE;

public class ListeProduit {

	/**
	 * Liste les catégories ou les sous-categories dans un tableau exploitable par un objet JCombobox
	 * @param doitListerMeres vrai si ce sont les actégories mères qui doivent être listées, faux si ce sont les sous catégories
	 * @return le tableau des catégories.
	 */
	public String[] listerCategoriesOuSousCategories(final boolean doitListerMeres){
		String[] tabCategories;
		try {	        
	        C_Categorie[] listeCategoriesMeres = CorbaManager.getManagerCategorie().listerCategoriesMeres();
	        int taille = listeCategoriesMeres.length;
	        if(doitListerMeres) {
	        	tabCategories = new String[taille];
	        	for(int i=0; i<taille; i++){
	        		tabCategories[i] = listeCategoriesMeres[i].id+"-"+listeCategoriesMeres[i].nom;
	        	}
	        } else {
	        	List<C_Categorie> listTempCategorieFilles = new ArrayList<C_Categorie>();
	        	for (C_Categorie categorieMereCourante : listeCategoriesMeres){
	        		C_Categorie[] listeCategorieFilles = CorbaManager.getManagerCategorie().listerSousCategories(categorieMereCourante.id);
	        		for(C_Categorie categorieFilleCourante : listeCategorieFilles){
	        			listTempCategorieFilles.add(categorieFilleCourante);
	        		}
	        	}
	        	
	        	int tailleFille = listTempCategorieFilles.size();
	        	tabCategories = new String[tailleFille];
	        	for(int i=0; i<tailleFille; i++){
	        		C_Categorie categorie = listTempCategorieFilles.get(i);
        			tabCategories[i] = categorie.id+"-"+categorie.nom;
        		}
	        }
	        
		} catch (Exception e) {
			tabCategories = new String[0];
		}
		
		return tabCategories;
	}
	
	public String[][] getListProduit (FILTRE filtre, String categorieSelected) throws EncheresUIException{
		try {
			String[][] tabProduits = null;
			
	        // définir le filtre Corba qui servira à lister les produits.
	        C_Filtre filtreCorba;
	        int idCategorie = -1;
	        if(filtre == FILTRE.TOUS){
	        	filtreCorba = C_Filtre.Tous;
	        } else if(filtre == FILTRE.PAR_CATEGORIE || filtre == FILTRE.PAR_SOUS_CATEGORIE){
	        	filtreCorba = C_Filtre.ParCategorie;
	        	idCategorie = Integer.valueOf((categorieSelected.split("-"))[0]);
	        } else {
	        	filtreCorba = C_Filtre.Tous;
	        }
	    	C_Produit[] tabTousProduit = CorbaManager.getManagerProduit().listerProduitsAvecFiltre(filtreCorba, idCategorie);
	    	int taille = tabTousProduit.length;
	    	tabProduits = new String[taille][4];
	    	for(int i=0; i<taille; i++){
	    		// référence du produit
	    		tabProduits[i][0] = String.valueOf(tabTousProduit[i].id);
	    		// libellé du produit
	    		tabProduits[i][1] = tabTousProduit[i].nom;
	    		// enchère la plus récente du produit
	    		try {
	        		C_Enchere[] listEncheres = tabTousProduit[i].encheres;
	        		DateFormat format = new SimpleDateFormat("dd/MM/yyyy");
	        		int tailleEnchere = listEncheres.length;
	        		if(tailleEnchere > 0){
	        			//récupérer la première date d'enchère
						Date dateCourante = format.parse(listEncheres[0].date);
						tabProduits[i][2] = String.valueOf(listEncheres[0].prix);
	        			// si la date courante d'enchère est > à première dateEnregistré alors enregistrer le prix
	        			for(C_Enchere enchereCourante : listEncheres){
	        				Date dateEnchere = format.parse(enchereCourante.date);
	        				if(dateCourante.before(dateEnchere)){
	        					tabProduits[i][2] = String.valueOf(enchereCourante.prix);
	        					dateCourante = dateEnchere;
	        				}
	        			}
	        		} else {
	        			// Il n'y a pas eu d'enchères sur ce produit.
	        			tabProduits[i][2] = "";
	        		}
	    		} catch (ParseException e) {
	    			tabProduits[i][2] = "";
					e.printStackTrace();
				}
	    		// échéance du produit
	    		tabProduits[i][3] = tabTousProduit[i].dateEcheance;
	    	}
	    	return tabProduits;
		} catch (Exception e) {
			e.printStackTrace();
			throw new EncheresUIException("Impossible de lister les produits", e);
		}
	}
}
